package risk.control.project.utils.vaild;

import java.util.regex.Pattern;

/**
 * 中国大陆手机号码校验工具类
 * 支持所有最新号段（包括虚拟运营商、物联网等）
 */
public class ChinaPhoneValidator {

    // 中国大陆手机号码正则表达式（最新所有号段）
    private static final String PHONE_REGEX = "^1(3[0-9]|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\d{8}$";

    // 各运营商号段分类
    private static final String[] OPERATOR_PREFIXES = {
            // 中国移动
            "134", "135", "136", "137", "138", "139", "147", "148", "150", "151", "152", "157", "158", "159", "172", "178", "182", "183", "184", "187", "188", "195", "198",

            // 中国联通
            "130", "131", "132", "145", "146", "155", "156", "166", "171", "175", "176", "185", "186", "196",

            // 中国电信
            "133", "149", "153", "173", "174", "177", "180", "181", "189", "190", "191", "193", "199",

            // 虚拟运营商
            "162", "165", "167", "170", "171",

            // 物联网
            "144", "140", "141",

            // 广电
            "192"};

    /**
     * 校验是否为有效的中国大陆手机号码
     *
     * @param phoneNumber 手机号码
     * @return true-有效，false-无效
     */
    public static boolean isValid(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.isEmpty()) {
            return false;
        }

        // 去除所有非数字字符
        String cleanedNumber = phoneNumber.replaceAll("[^0-9]", "");

        // 基础校验：11位数字，1开头，符合号段规则
        return Pattern.matches(PHONE_REGEX, cleanedNumber);
    }

    /**
     * 获取手机号码运营商
     *
     * @param phoneNumber 手机号码
     * @return 运营商名称（未知/中国移动/中国联通/中国电信/虚拟运营商/物联网/广电）
     */
    public static String getOperator(String phoneNumber) {
        if (!isValid(phoneNumber)) {
            return "未知";
        }

        String cleanedNumber = phoneNumber.replaceAll("[^0-9]", "");
        String prefix3 = cleanedNumber.substring(0, 3);
        String prefix4 = cleanedNumber.substring(0, 4);

        // 特殊号段判断
        if (prefix3.equals("192")) {
            return "广电";
        }
        if (prefix3.equals("144") || prefix3.equals("140") || prefix3.equals("141")) {
            return "物联网";
        }
        if (prefix3.equals("170") || prefix3.equals("171") || prefix3.equals("162") || prefix3.equals("165") || prefix3.equals("167")) {
            return "虚拟运营商";
        }

        // 主要运营商判断
        if (prefix3.equals("134") || prefix3.equals("135") || prefix3.equals("136") || prefix3.equals("137") || prefix3.equals("138") || prefix3.equals("139") || prefix3.equals("147") || prefix3.equals("148") || prefix3.equals("150") || prefix3.equals("151") || prefix3.equals("152") || prefix3.equals("157") || prefix3.equals("158") || prefix3.equals("159") || prefix3.equals("172") || prefix3.equals("178") || prefix3.equals("182") || prefix3.equals("183") || prefix3.equals("184") || prefix3.equals("187") || prefix3.equals("188") || prefix3.equals("195") || prefix3.equals("198")) {
            return "中国移动";
        }

        if (prefix3.equals("130") || prefix3.equals("131") || prefix3.equals("132") || prefix3.equals("145") || prefix3.equals("146") || prefix3.equals("155") || prefix3.equals("156") || prefix3.equals("166") || prefix3.equals("175") || prefix3.equals("176") || prefix3.equals("185") || prefix3.equals("186") || prefix3.equals("196")) {
            return "中国联通";
        }

        if (prefix3.equals("133") || prefix3.equals("149") || prefix3.equals("153") || prefix3.equals("173") || prefix3.equals("174") || prefix3.equals("177") || prefix3.equals("180") || prefix3.equals("181") || prefix3.equals("189") || prefix3.equals("190") || prefix3.equals("191") || prefix3.equals("193") || prefix3.equals("199")) {
            return "中国电信";
        }

        return "未知";
    }

    /**
     * 格式化手机号码（3-4-4格式）
     *
     * @param phoneNumber 手机号码
     * @return 格式化后的号码（如：138 1234 5678）
     */
    public static String format(String phoneNumber) {
        if (!isValid(phoneNumber)) {
            return phoneNumber;
        }

        String cleanedNumber = phoneNumber.replaceAll("[^0-9]", "");
        return cleanedNumber.substring(0, 3) + " " + cleanedNumber.substring(3, 7) + " " + cleanedNumber.substring(7);
    }

    /**
     * 隐藏手机号码中间四位
     *
     * @param phoneNumber 手机号码
     * @return 隐藏后的号码（如：138****5678）
     */
    public static String hideMiddle(String phoneNumber) {
        if (!isValid(phoneNumber)) {
            return phoneNumber;
        }

        String cleanedNumber = phoneNumber.replaceAll("[^0-9]", "");
        return cleanedNumber.substring(0, 3) + "****" + cleanedNumber.substring(7);
    }
}
